﻿using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using kk.components.contracts;
using kk.messages.contracts.ViewModel;
using kk.messages.contracts.DataModel;
using System.Collections.Generic;

namespace kk.belegungsplanansicht 
{
  public partial class BelegungsplanAnsicht : UserControl, IBelegungsplanAnsicht
  {
      private int _layoutSitzplatzControlWidth = 50;
      private int _layoutSitzplatzControlHeight = 40;

      private int _layoutSitzplatzAbstand = 60;
      private int _layoutReihenAbstand = 50;

      private const int LayoutOffsetY = 60;

      private Belegungsplan _belegungsplan;

    public BelegungsplanAnsicht()
    {
      InitializeComponent();
      _sitzControls = new List<Control>();

      legendetKatA.Platz = new Platzbelegung( new Platzposition(),new Preiskategorie('A' , 0.0 ), false );
      legendetKatB.Platz = new Platzbelegung(new Platzposition(), new Preiskategorie('B', 0.0), false);
      legendetKatC.Platz = new Platzbelegung(new Platzposition(), new Preiskategorie('C', 0.0), false);
      legendetKatD.Platz = new Platzbelegung(new Platzposition(), new Preiskategorie('D', 0.0), false);
      legendeBelegt.Platz = new Platzbelegung(new Platzposition(), new Preiskategorie('D', 0.0), true);
    }

    public void ProcessBelegungsplan(Belegungsplan belegungsplan)
    {
        _belegungsplan = belegungsplan;
        DebugTraceToTextBox(belegungsplan);

        ZeigeSitzplatzLayout(belegungsplan);
    }

      private List<Control> _sitzControls;

      private void ZeigeSitzplatzLayout(Belegungsplan belegungsplan)
      {
          CalculateLayout(belegungsplan);

          if (_sitzControls != null)
          {
              foreach( Control c in _sitzControls )
              {
                  Controls.Remove( c );
              }
          }

          _sitzControls = new List<Control>();
          foreach( var sitz in belegungsplan.Plätze )
          {
              var b = SitzControlFactory(sitz);
              _sitzControls.Add(b);
              Controls.Add(b);
          }

          UpdateStatusLine();
      }

      private SitzplatzAnsicht SitzControlFactory(Platzbelegung sitz)
      {
          var sa = new SitzplatzAnsicht {Platz = sitz};
          sa.Click += Sitzplatz_Click; 
          sa.Location = ButtonPositionFactory( sitz.Position );
          sa.Size = new Size(_layoutSitzplatzControlWidth, _layoutSitzplatzControlHeight);
          return sa;
      }

      private Point ButtonPositionFactory(Platzposition p)
      {
          int x = p.Platznummer * _layoutSitzplatzAbstand;
          int y = LayoutOffsetY + ( (int) p.Reihe - (int)'A' ) * _layoutReihenAbstand;
          return new Point( x, y );
      }

      private void DebugTraceToTextBox(Belegungsplan belegungsplan)
      {
          textBox1.Lines = belegungsplan.Plätze.Select(platz => string.Format("R {0} PN {1} PK {2} B {3}\n\r", platz.Position.Reihe, platz.Position.Platznummer, platz.Preiskategorie.KategorieSchlüssel, platz.IstBelegt)).ToArray();
      }

 
      private void Sitzplatz_Click(object sender, System.EventArgs e)
      {
          UpdateStatusLine();
          OnPlatzwahlChanged( GetSelected().Select(p => p.Position).ToList() );
      }

      private void UpdateStatusLine()
      {
          var selectedCount = GetSelected().Count();
          var price = GetSelectedTotalPrice();

          labelStatus.Text = string.Format("{0} Plätze ausgewählt, Gesampreis {1}", selectedCount, price);
      }

      private double GetSelectedTotalPrice()      
      {
          return GetSelected().Sum(platz => platz.Preiskategorie.Preis);
      }

      private IEnumerable<Platzbelegung> GetSelected()
      {
          return from SitzplatzAnsicht c in _sitzControls where c.IsSelected select c.Platz;
      }


      private void CalculateLayout(Belegungsplan belegungsplan)
      {
          int maxX = 0;
          int maxY = 0;
          foreach( var sitz in belegungsplan.Plätze )
          {
              Platzposition p = sitz.Position;
              int x = p.Platznummer;
              int y = ((int) p.Reihe - (int) 'A');

              if ( x > maxX )
                  maxX = x;

              if ( y > maxY )
                  maxY = y;
          }

          maxY += 3;
          maxX += 2;

          _layoutSitzplatzAbstand = (Size.Width/maxX);
          _layoutReihenAbstand = (Size.Height/maxY);

          _layoutSitzplatzControlWidth = _layoutSitzplatzAbstand * 4 / 5;
          _layoutSitzplatzControlHeight = _layoutReihenAbstand * 4 / 5;    
      }

      private void BelegungsplanAnsicht_Resize(object sender, System.EventArgs e)
      {
          if (_belegungsplan == null )
              return;

          ZeigeSitzplatzLayout(_belegungsplan);
      }

      #region IBelegungsplanAnsicht Members

      public event System.Action<IEnumerable<Platzposition>> OnPlatzwahlChanged;

      #endregion

      private void sitzplatzAnsichtKatA_Load(object sender, System.EventArgs e)
      {

      }
  }
}
